package cn.edu.gdu.quizpractice.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.Column;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Generated;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.io.Serial;
import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;

/**
 * @Author: Aubery
 * @Date: 2025-01-15-16:02
 * @Description:
 */
@Data
@TableName("t_manager")
@AllArgsConstructor
@NoArgsConstructor
public class Manager implements UserDetails, Serializable {

    // 序列号
    @Serial
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    /**
     * 管理员姓名
     */
    private String name;

    /**
     * 电话号码(登录时的用户名)
     */
    @Column(unique = true)
    @NotBlank(message = "电话号码不能为空")
    @Pattern(regexp = "^(?:(?:\\+|00)86)?1\\d{10}$", message = "电话号码格式不正确")
    private String telephone;

    /**
     * 密码
     */
    //@NotBlank(message = "密码不能为空")
    @Pattern(regexp = "^\\S*(?=\\S{6,})(?=\\S*\\d)(?=\\S*[A-Z])(?=\\S*[a-z])(?=\\S*[!@#$%^&*? ,.])\\S*$",
            message = "密码最少为6位，包括至少一个大写字母，1个小写字母，1个数字，1个特殊字符")
    @JsonIgnore // 忽略序列化，不返回给前端
    private String password;
    /**
     * 电子邮箱
     */
    @NotBlank(message = "邮箱不能为空")
    //@Pattern(regexp = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$", message = "邮箱格式不正确")
    @Email
    private String email;
    /**
     * 状态:0表示禁用,1表示可用
     */
    private int status;
    /**
     * 类型：0表示超级管理员，1表示普通管理员
     */
    private int type;

    /**
     * 获取用户的权限（角色）
     * 根据 type 字段返回不同的角色
     */
    @Override
    @JsonIgnore
    public Collection<? extends GrantedAuthority> getAuthorities() {
        String role = (type == 0) ? "ROLE_SUPER_ADMIN" : "ROLE_ADMIN";
        return Collections.singletonList(new SimpleGrantedAuthority(role));
    }

    /**
     * 获取用户名（这里使用 telephone 作为用户名）
     */
    @Override
    public String getUsername() {
        return telephone;
    }

    /**
     * 账户是否未过期
     */
    @JsonIgnore // 忽略序列化，不返回给前端
    @Override
    public boolean isAccountNonExpired() {
        return true; // 默认返回 true，表示账户未过期
    }

    /**
     * 账户是否未锁定
     */
    @JsonIgnore // 忽略序列化，不返回给前端
    @Override
    public boolean isAccountNonLocked() {
        return true; // 默认返回 true，表示账户未锁定
    }

    /**
     * 凭证（密码）是否未过期
     */
    @JsonIgnore // 忽略序列化，不返回给前端
    @Override
    public boolean isCredentialsNonExpired() {
        return true; // 默认返回 true，表示凭证未过期
    }

    /**
     * 获取密码
     */
    @Override
    public String getPassword() {
        return password;
    }

    /**
     * 账户是否启用
     * 根据 status 字段判断账户是否可用
     */
    @JsonIgnore // 忽略序列化，不返回给前端
    @Override
    public boolean isEnabled() {
        return status == 1; // status 为 1 表示账户可用
    }
}
